<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<script>
		/**
		 * 第一题  参数值销毁
		 */
		/*var a = {n:1};
		var b = {n:2};
		b.x = a = {n:3};
		console.log(b.x); ==> {n:3}

		a.x = a = {n:3};
		console.log(a.x); ==> undefined*/


		/**
		 * 第二题  单线程工作原理
		 */
		/*var start = new Date();
		setTimeout(function(){
			console.log(new Date()-start);
		}, 500);  // 结果 >=500
		while ((new Date()-start)<=1000) {}   // 结果 >=1000 */


		/**
		 * 第三题  this指针问题
		 * 问题：为什么前面log的可以使用，而write使用不了，
		 * 答：只能猜测 console.log 函数做了if判断当前this指针是不是console。
		 */
		/*var log = console.log;
		var hint = window.alert;
		var write = document.write;
		log("123");  //正常输出123
		hint("123");  //正常输出123

		//write("123");  //提示报错
		write.call(document,"123");  //正确代码*/

		/**
		 * 第四题  作用域
		 * caller:所有类型为function的对象，全都有caller属性
		 * callee:所有arguments对象都有calle属性，当前arguments对象是在输入哪个函数的参数对象
		 */
		/*var name = "A";
		function getName(){
			// console.log(this);
			// console.log(getName.caller);
			// console.log(this.callee);
			return this.name;
		}
		var obj = {
			name: "B",
			getName:function(){
				return this.name;
			},
			showName:function(a){
				console.log(getName());
				console.log(a());
				// arguments 对象是函数在调用过程中产生的闭包中的内置对象
				console.log(arguments[0]());
			}
		}
		obj.showName(getName,1);*/


		/**
		 * 第五题  异步执行流程，解决异步函数回调问题
		 * 涉及es6、es7 typescript Promisee
		 * 只要函数前面加上 asyns 这个关键字，那么该函数调用的返回结果值一定是promiss对象的实例
		 *
		 * console输出结果：
		 * 1、script start
		 * 2、async1 start
		 * 3、async2
		 * 4、promise1
		 * 5、script end
		 * 6、async1 end
		 * 7、promise2
		 * 8、setTimeout
		 */
		async function async1() {
			console.log('async1 start');
			await async2();
			console.log('async1 end');
		}
		async function async2() {
			console.log('async2');
		}
		console.log('script start');
		setTimeout(function(){
			console.log('setTimeout');
		}, 0);
		async1();
		new Promise(function(resolve){
			console.log('promise1');
			resolve();
		}).then(function(){
			console.log('promise2');
		});
		console.log('script end');




	</script>
</body>
</html>